#ifndef CARTOGRAPHER_IMUOPTIONS_H_
#define CARTOGRAPHER_IMUOPTIONS_H_

namespace cartographer
{
    class ImuOptions
    {
    public:
        ~ImuOptions()
        {
        }
        ImuOptions(const ImuOptions &) = delete;
        ImuOptions &operator=(const ImuOptions &) = delete;
        static ImuOptions &GetInstance()
        {
            static ImuOptions instance;
            return instance;
        }

        bool use_imu_optimize;
        bool use_imu_integrate;
        bool imu_opt_use_identity_information;
        int optimizer_win_size;
        float noise_acc;
        float noise_gyro;
        float walk_acc;
        float walk_gyro;
        float frequency;

    private:
        ImuOptions()
        {
        }
    };

    class ImuOptionsFilter
    {
    public:
        ~ImuOptionsFilter()
        {
        }
        ImuOptionsFilter(const ImuOptionsFilter &) = delete;
        ImuOptionsFilter &operator=(const ImuOptionsFilter &) = delete;
        static ImuOptionsFilter &GetInstance()
        {
            static ImuOptionsFilter instance;
            return instance;
        }

        bool filterGyro;
        double intervalMax;
        double threshAccHorizon;
        double threshGyroHorizon;
        double threshVerticalRatio;

    private:
        ImuOptionsFilter()
        {
        }
    };

    class ImuOptionsComplementary
    {
    public:
        ~ImuOptionsComplementary()
        {
        }
        ImuOptionsComplementary(const ImuOptionsComplementary &) = delete;
        ImuOptionsComplementary &operator=(const ImuOptionsComplementary &) = delete;
        static ImuOptionsComplementary &GetInstance()
        {
            static ImuOptionsComplementary instance;
            return instance;
        }

        bool use_mag;
        bool do_adaptive_gain;
        bool do_bias_estimation;
        double gain_acc;
        double gain_mag;
        double bias_alpha;

    private:
        ImuOptionsComplementary()
        {
        }
    };
} // namespace cartographer

#endif